package com.wzdigit.wms.wms.service.core;

import com.wzdigit.wms.basic.util.common.SeparatorString;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.lang.reflect.Method;

@Service
public class InvokeMethodService {

	@Autowired
    private WmsSpringUtil springUtil;
	
	/**
	 * @param dealClassName		反射处理对象
	 * @param dealMethodName	反射处理函数
	 * @param parameterArray	反射入参数组
	 * @return
	 * @throws Exception
	 */
	public Object invokeMethod(String dealClassName, String dealMethodName, Object... parameterArray)
			throws Exception {
		if(StringUtils.isEmpty(dealClassName) || StringUtils.isEmpty(dealMethodName)) {
			throw new Exception("反射处理对象或反射处理函数不能为空！");
		}
		Class<?> dealClass = Class.forName(dealClassName);
		Object bean = springUtil.getBean(dealClass);
		if(parameterArray == null || parameterArray.length == 0) {
			// 无参函数
			Method method = bean.getClass().getMethod(dealMethodName);
			return method.invoke(bean);
		} else {
			// 有参函数
			Class<?>[] parameterClassArray = new Class[parameterArray.length];
			for (int i = 0; i < parameterArray.length; i++) {
				parameterClassArray[i] = parameterArray[i].getClass();
			}
			Method method = bean.getClass().getMethod(dealMethodName, parameterClassArray);
			return method.invoke(bean, parameterArray);
		}
	}
	
	/**
	 * @param dealClassName		反射处理对象
	 * @param dealMethodName	反射处理函数
	 * @param parameterType		反射入参类型
	 * @param parameterArray	反射入参数组
	 * @return
	 * @throws Exception
	 */
	public Object invokeMethod(String dealClassName, String dealMethodName, String parameterType, Object... parameterArray)
			throws Exception {
		if(StringUtils.isEmpty(dealClassName) || StringUtils.isEmpty(dealMethodName)) {
			throw new Exception("反射处理对象或反射处理函数不能为空！");
		}
		Class<?>[] parameterClassArray = null;
		if(StringUtils.isNotBlank(parameterType)) {
			String[] parameterTypeArray = parameterType.split(SeparatorString.COMMA);
			parameterClassArray = new Class[parameterTypeArray.length];
			for (int i = 0; i < parameterTypeArray.length; i++) {
				parameterClassArray[i] = Class.forName(parameterTypeArray[i]);
			}
		}
		if(parameterClassArray == null || parameterClassArray.length == 0) {
			if(parameterArray != null && parameterArray.length > 0) {
				throw new Exception("入参数量不一致！");
			}
		} else {
			if(parameterArray == null || parameterArray.length == 0 
					|| parameterArray.length != parameterClassArray.length) {
				throw new Exception("入参数量不一致！");
			} else {
				for (int i = 0; i < parameterClassArray.length; i++) {
					if (parameterArray[i].getClass() != parameterClassArray[i]) {
						throw new Exception("入参类型不一致！");
					}
				}
			}
		}
		
		Class<?> dealClass = Class.forName(dealClassName);
		Object bean = springUtil.getBean(dealClass);
		if(parameterArray == null || parameterArray.length == 0) {
			// 无参函数
			Method method = bean.getClass().getMethod(dealMethodName);
			return method.invoke(bean);
		} else {
			// 有参函数
			Method method = bean.getClass().getMethod(dealMethodName, parameterClassArray);
			return method.invoke(bean, parameterArray);
		}
	}
}
